All posts

Product Aug 14, 2026 4 min read

Inbound email as structured JSON

Replies used to be the part of email nobody wanted to build. Herald now parses every inbound message into a document your code can read.

Teo Halvorsen

Sending email is a solved problem. Receiving it is where the bodies are buried. Every team that has tried to handle replies has written the same code: an SMTP listener, a MIME parser that works on ninety percent of messages, a special case for Outlook's quoted text, a second special case for signatures, and a cron job that cleans up the attachments nobody deleted.

As of this week, Herald does that part. Point an address at us and every message that arrives becomes a JSON document delivered to a webhook.

What you get

The document has the parts you would expect: sender, recipients, subject, the plain-text body and the HTML body. It also has the parts that take a week to get right on your own.

  • The reply, on its own. Quoted text and signatures are stripped into separate fields, so the reply field is just what the person typed.
  • Attachments as URLs. Each one is stored, scanned, and handed to you as a signed link with the filename, the type, and the size. Nothing base64-encoded in the payload.
  • A verified sender. SPF, DKIM, and DMARC results are in the document, so you can decide whether to trust the message before you act on it.
  • The thread. If the inbound message is a reply to something Herald sent, the original message id is on the document. You do not have to parse headers to stitch the conversation together.

What people are building with it

The first customers to turn it on used it for support inboxes, which we expected. The second wave was more interesting: agents. An assistant that sends a message on someone's behalf can now read the reply, decide what to do, and send again, without a human copying text between windows.

{
  "from": "sam@acme.com",
  "subject": "Re: Your invoice for March",
  "reply": "Paid this morning, thanks.",
  "attachments": [],
  "auth": { "spf": "pass", "dkim": "pass", "dmarc": "pass" },
  "in_reply_to": "msg_8f2k"
}

Inbound is on every plan, including Hobby. Messages count toward your monthly volume the same way sends do. The setup is one MX record, and the docs walk through it in about four minutes.